向客户端发送数据,函数原型:
bool Server->send(mixed $fd, string $data, int $serverSocket = -1);
发送过程是异步的,底层会自动监听可写,将数据逐步发送给客户端
$fd
,客户端的文件描述符$data
,发送的数据,TCP
协议最大不得超过2M
,可修改 buffer_output_size 改变允许发送的最大包长度$serverSocket
,向Unix Socket DGRAM
对端发送数据时需要此项参数,TCP
客户端不需要填写
- 发送成功会返回
true
- 发送失败会返回
false
,调用$server->getLastError()
方法可以得到失败的错误码
send
操作具有原子性,多个进程同时调用send
向同一个TCP
连接发送数据,不会发生数据混杂
- 如果要发送超过
2M
的数据,可以将数据写入临时文件,然后通过sendfile
接口进行发送 - 通过设置 buffer_output_size 参数可以修改发送长度的限制
- 在发送超过
8K
的数据时,底层会启用Worker
进程的共享内存,需要进行一次Mutex->lock
操作
- 当
Worker
进程的管道缓存区已满时,发送8K
数据将启用临时文件存储 - 如果连续向同一个客户端发送大量数据,可能会导致
Socket
内存缓存区塞满,底层会立即返回false
,应用程序可以调整socket_buffer_size
设置,或 将数据保存到磁盘,等待客户端收完已发送的数据后再进行发送
在协程模式下send
遇到缓存区已满时会自动挂起,当触发onBufferEmpty
时恢复协程,继续发送数据。
监听UnixSocket DGRAM
端口时,可以使用send
向对端发送数据。
$serv->on("packet", function (Swoole\Server $serv, $data, $addr)
{
$serv->send($addr['address'], 'SUCCESS', $addr['server_socket']);
});